// test_libmodbus.cpp
#include <iostream>
#include <modbus.h>

int main()
{
    // 创建 Modbus TCP 客户端，连接到端口 5020
    modbus_t *ctx = modbus_new_tcp("127.0.0.1", 5020);
    if (!ctx)
    {
        std::cerr << "无法创建 Modbus 上下文\n";
        return -1;
    }

    // 连接服务器
    if (modbus_connect(ctx) == -1)
    {
        std::cerr << "连接失败: " << modbus_strerror(errno) << "\n";
        modbus_free(ctx);
        return -1;
    }

    std::cout << "成功连接到 Modbus Slave!\n";

    // 读取保持寄存器 40001~40003 (地址从0开始)
    uint16_t tab_reg[3];
    int rc = modbus_read_registers(ctx, 0, 3, tab_reg);
    if (rc == -1)
    {
        std::cerr << "读取失败: " << modbus_strerror(errno) << "\n";
    }
    else
    {
        std::cout << "读取到的寄存器值: ";
        for (int i = 0; i < rc; i++)
        {
            std::cout << tab_reg[i] << " ";
        }
        std::cout << "\n";
    }

    // 写入保持寄存器示例
    uint16_t write_reg[2] = {100, 200};
    rc = modbus_write_registers(ctx, 0, 2, write_reg);
    if (rc == -1)
    {
        std::cerr << "写入失败: " << modbus_strerror(errno) << "\n";
    }
    else
    {
        std::cout << "成功写入 " << rc << " 个寄存器\n";
    }

    rc = modbus_write_register(ctx, 2, 999);
    if (rc == -1)
    {
        std::cerr << "写入失败: " << modbus_strerror(errno) << "\n";
    }
    else
    {
        std::cout << "成功写入 1 个寄存器\n";
    }

    // 断开连接
    modbus_close(ctx);
    modbus_free(ctx);
    return 0;
}
